#ifndef __ZY_NET_H__
#define __ZY_NET_H__

#include <iostream>
#include <unordered_map>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

typedef struct IcrDb_ {
    std::unordered_map<std::string, int> intMap;
} IcrDb;

typedef int (*TsRequestHandler)(const std::string& request, std::string& response, IcrDb& icrDb);
int processStepUpdate(const std::string& request, std::string& response, IcrDb& icrDb);
int start_ts(in_addr_t host_ip, int PORT, TsRequestHandler handler, IcrDb& icrDb);

int get_sock_tc(int& sock, const char* server_ip, int port);
int send_msg_tc(const int& sock, const std::string& message, std::string& response);
int TC_send_msg(const char* server_ip, int PORT, const std::string& message, std::string& response);

int tcp_client_send(const std::string& message, std::string& response);
int tcp_server_main();

// 定义系统常量
extern std::string ZR_AIS; // = "tcp://192.168.1.115:8001";

// 系统状态值定义
const int STEP1 = 10; // 系统开始
const int STEP2 = STEP1 + 1; // DataRepository通知通知AIPCNet, AICIFARNet, AIE2ENet进行训练
const int STEP2_1 = STEP2 + 1; // AIPCNet, AICIFARNet, AIE2ENet开始训练
const int STEP3 = STEP2_1 + 3; // AICIFARNet训练完成，通知AICFAR升级
const int STEP3_1 = STEP2_1 + 5; // AIPCNet训练完成，通知AIPC升级
const int STEP3_2 = STEP2_1 + 7; // AIE2ENet训练完成，通知AIE2E升级
const int STEP4 = STEP3 + 10; // AICFAR升级完成，精度提高
const int STEP4_1 = STEP3_1 + 10; // AIPC升级完成，运行速度变快
const int STEP4_2 = STEP3_2 + 10; // AIE2E升级完成，精度提高
// 从此之后AI算法：AIPC, AICFAR, AIE2E投入正式运行
const int STEP5 = STEP4_2 + 5; // CFARMonitor识别到AICFAR与传统CFAR结果有差异，通知AICFARNet开始训练
const int STEP5_1 = STEP5 + 1; // AICFARNet开始训练
const int STEP6 = STEP5_1 + 3; // AICFARNet训练完成，通知AICFAR升级
const int STEP6_1 = STEP6 + 1; // AICFAR升级完成
const int STEP7 = STEP6_1 + 1; // AIE2EMonitor识别出与传统算法有差异，通知AIE2ENet开始训练
const int STEP7_1 = STEP7 + 1; // AIE2ENet开始训练
const int STEP8 = STEP7_1 + 3 + 20; // AIE2ENet训练完成，通知AIE2E升级
const int STEP9 = STEP8 + 1 + 10; // AIE2E升级完成
const int STEP10 = STEP9 + 5; // AIE2EMonitor识别到未能检测出虚拟真值目标，通知AIE2ENet开始训练
const int STEP10_1 = STEP10 + 1; // AIE2ENet开始训练
const int STEP11 = STEP10_1 + 3 + 20; // AIE2ENet训练结束，通知AIE2E升级
const int STEP12 = STEP11 + 1 + 20; // AIE2E升级完成
const int STEP13 = STEP12 + 1 + 10; // AIE2ENet识别到自监督算法差异，通知AIE2ENet进行训练
const int STEP13_1 = STEP13 + 1; // AIE2E开始训练
const int STEP14 = STEP13 + 3 + 10; // AIE2ENet训练完成，通知AIE2E升级
const int STEP15 = STEP14 + 1 + 20; // AIE2E升级完成

#endif